home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __version__ = '6.0'
- __title__ = 'Fax Address Book'
- __mod__ = 'hp-fab'
- __doc__ = 'A simple fax address book for HPLIP.'
- import cmd
- import getopt
- import os
- from base.g import *
- from base import utils, tui, module
-
- class Console(cmd.Cmd):
-
- def __init__(self):
- cmd.Cmd.__init__(self)
- self.intro = "Type 'help' for a list of commands. Type 'exit' or 'quit' to quit."
- self.db = fax.FaxAddressBook()
- self.prompt = log.bold('hp-fab > ')
-
-
- def do_hist(self, args):
- '''Print a list of commands that have been entered'''
- print self._hist
-
-
- def do_exit(self, args):
- '''Exits from the console'''
- return -1
-
-
- def do_quit(self, args):
- '''Exits from the console'''
- return -1
-
-
- def do_EOF(self, args):
- '''Exit on system end of file character'''
- return self.do_exit(args)
-
-
- def do_help(self, args):
- """Get help on commands
- 'help' or '?' with no arguments prints a list of commands for which help is available
- 'help <command>' or '? <command>' gives help on <command>
- """
- cmd.Cmd.do_help(self, args)
-
-
- def preloop(self):
- '''Initialization before prompting user for commands.
- Despite the claims in the Cmd documentaion, Cmd.preloop() is not a stub.
- '''
- cmd.Cmd.preloop(self)
- self._hist = []
- self._locals = { }
- self._globals = { }
- self.do_list('')
-
-
- def postloop(self):
- '''Take care of any unfinished business.
- Despite the claims in the Cmd documentaion, Cmd.postloop() is not a stub.
- '''
- cmd.Cmd.postloop(self)
- print 'Exiting...'
-
-
- def precmd(self, line):
- ''' This method is called after the line has been input but before
- it has been interpreted. If you want to modifdy the input line
- before execution (for example, variable substitution) do it here.
- '''
- self._hist += [
- line.strip()]
- return line
-
-
- def postcmd(self, stop, line):
- '''If you want to stop the console, return something that evaluates to true.
- If you want to do some post command processing, do it here.
- '''
- return stop
-
-
- def emptyline(self):
- '''Do nothing on empty input line'''
- pass
-
-
- def default(self, line):
- log.error("Unrecognized command. Use 'help' to list commands.")
-
-
- def get_nickname(self, args, fail_if_match = True, alt_text = False):
- if not args:
- while True:
- if alt_text:
- nickname = raw_input(log.bold('Enter the name to add to the group (<enter>=done*, c=cancel) ? ')).strip()
- else:
- nickname = raw_input(log.bold('Enter name (c=cancel) ? ')).strip()
- if nickname.lower() == 'c':
- print log.red('Canceled')
- return ''
- if fail_if_match:
- if self.db.get(nickname) is not None:
- log.error('Name already exists. Please choose a different name.')
- continue
-
- elif self.db.get(nickname) is None:
- log.error('Name not found. Please enter a different name.')
- continue
-
- break
- continue
- None if not nickname else nickname.lower() == 'c'
- else:
- nickname = args.strip()
- if fail_if_match:
- if self.db.get(nickname) is not None:
- log.error('Name already exists. Please choose a different name.')
- return ''
- elif self.db.get(nickname) is None:
- log.error('Name not found. Please enter a different name.')
- return ''
- return nickname
-
-
- def get_groupname(self, args, fail_if_match = True, alt_text = False):
- all_groups = self.db.get_all_groups()
- if not args:
- while True:
- if alt_text:
- groupname = raw_input(log.bold('Enter the group to join (<enter>=done*, c=cancel) ? ')).strip()
- else:
- groupname = raw_input(log.bold('Enter the group (c=cancel) ? ')).strip()
- if groupname.lower() == 'c':
- print log.red('Canceled')
- return ''
- if groupname == 'All':
- print "Cannot specify group 'All'. Please choose a different group."
- return ''
- if fail_if_match:
- if groupname in all_groups:
- log.error('Group already exists. Please choose a different group.')
- continue
-
- elif groupname not in all_groups:
- log.error('Group not found. Please enter a different group.')
- continue
-
- break
- else:
- groupname = args.strip()
- if fail_if_match:
- if groupname in all_groups:
- log.error('Group already exists. Please choose a different group.')
- return ''
- elif groupname not in all_groups:
- log.error('Group not found. Please enter a different group.')
- return ''
- return groupname
-
-
- def do_list(self, args):
- '''
- List names and/or groups.
- list [names|groups|all|]
- dir [names|groups|all|]
- '''
- self.do_names('')
- self.do_groups('')
-
- do_dir = do_list
-
- def do_names(self, args):
- '''
- List names.
- names
- '''
- all_entries = self.db.get_all_records()
- log.debug(all_entries)
- print log.bold('\nNames:\n')
- if len(all_entries) > 0:
- f = tui.Formatter()
- f.header = ('Name', 'Fax Number', 'Notes', 'Member of Group(s)')
- for name, e in all_entries.items():
- if not name.startswith('__'):
- f.add((name, e['fax'], e['notes'], ', '.join(e['groups'])))
- continue
-
- f.output()
- else:
- print '(None)'
- print
-
-
- def do_groups(self, args):
- '''
- List groups.
- groups
- '''
- all_groups = self.db.get_all_groups()
- log.debug(all_groups)
- print log.bold('\nGroups:\n')
- if len(all_groups):
- f = tui.Formatter()
- f.header = ('Group', 'Members')
- for group in all_groups:
- ', '.join(([], [](_[1])))
-
- f.output()
- else:
- print '(None)'
- print
-
-
- def do_edit(self, args):
- '''
- Edit an name.
- edit [name]
- modify [name]
- '''
- nickname = self.get_nickname(args, fail_if_match = False)
- if not nickname:
- return None
- e = self.db.get(nickname)
- log.debug(e)
- print log.bold('\nEdit/modify information for %s:\n' % nickname)
- lastname = ''
- firstname = ''
- title = ''
- save_faxnum = e['fax']
- while True:
- faxnum = raw_input(log.bold("Fax Number (<enter>='%s', c=cancel) ? " % save_faxnum)).strip()
- if faxnum.lower() == 'c':
- print log.red('Canceled')
- return None
- if not faxnum and not save_faxnum:
- log.error('Fax number must not be empty.')
- continue
-
- if not faxnum:
- faxnum = save_faxnum
-
- ok = True
- for c in faxnum:
- if c not in '0123456789-(+) *#':
- log.error("Invalid characters in fax number. Fax number may only contain '0123456789-(+) '")
- ok = False
- break
- continue
-
- if ok:
- break
- continue
- save_notes = e['notes']
- notes = raw_input(log.bold("Notes (<enter>='%s', c=cancel) ? " % save_notes)).strip()
- if notes.lower() == 'c':
- print log.red('Canceled')
- return None
- if not notes:
- notes = save_notes
-
- if e['groups']:
- print '\nLeave or Stay in a Group:\n'
-
- new_groups = []
- for g in e['groups']:
- if g == 'All':
- continue
-
- (ok, ans) = tui.enter_yes_no('Stay in group %s ' % g, choice_prompt = '(y=yes* (stay), n=no (leave), c=cancel) ? ')
- if not ok:
- print log.red('Canceled')
- return None
- if ans:
- new_groups.append(g)
- continue
- ok
-
- print '\nJoin New Group(s):\n'
- while True:
- add_group = self.get_groupname('', fail_if_match = False, alt_text = True)
- if add_group.lower() == 'c':
- print log.red('Canceled')
- return None
- if not add_group:
- break
-
- all_groups = self.db.get_all_groups()
- if add_group not in all_groups:
- log.warn('Group not found.')
- (ok, ans) = tui.enter_yes_no('Is this a new group', choice_prompt = '(y=yes* (new), n=no, c=cancel) ? ')
- if not ok:
- print log.red('Canceled')
- return None
- if not ans:
- continue
-
-
- if add_group in e['groups']:
- log.error('Group already specified. Choose a different group name or press <enter> to continue.')
- continue
-
- new_groups.append(add_group)
- self.db.set(nickname, title, firstname, lastname, faxnum, new_groups, notes)
- self.do_show(nickname)
- print
-
- do_modify = do_edit
-
- def do_editgrp(self, args):
- '''
- Edit a group.
- editgrp [group]
- modifygrp [group]
- '''
- group = self.get_groupname(args, fail_if_match = False)
- if not group:
- return None
- old_entries = self.db.group_members(group)
- new_entries = []
- print '\nExisting Names in Group:\n'
- for e in old_entries:
- if not e.startswith('__'):
- (ok, ans) = tui.enter_yes_no("Should '%s' stay in this group " % e, choice_prompt = '(y=yes* (stay), n=no (leave), c=cancel) ? ')
-
- if not ok:
- print log.red('Canceled')
- return None
- if ans:
- new_entries.append(e)
- continue
- ok
-
- print '\nAdd New Names to Group:\n'
- while True:
- nickname = self.get_nickname('', fail_if_match = False, alt_text = True)
- if nickname.lower() == 'c':
- print log.red('Canceled')
- return None
- if not nickname.lower():
- break
-
- new_entries.append(nickname)
- self.db.update_groups(group, new_entries)
- print
-
- do_modifygrp = do_editgrp
-
- def do_add(self, args):
- '''
- Add an name.
- add [name]
- new [name]
- '''
- nickname = self.get_nickname(args, fail_if_match = True)
- if not nickname:
- return None
- print log.bold('\nEnter information for %s:\n' % nickname)
- title = ''
- firstname = ''
- lastname = ''
- while True:
- faxnum = raw_input(log.bold('Fax Number (c=cancel) ? ')).strip()
- if faxnum.lower() == 'c':
- print log.red('Canceled')
- return None
- if not faxnum:
- log.error('Fax number must not be empty.')
- continue
-
- ok = True
- for c in faxnum:
- if c not in '0123456789-(+) *#':
- log.error("Invalid characters in fax number. Fax number may only contain '0123456789-(+) *#'")
- ok = False
- break
- continue
-
- if ok:
- break
- continue
- notes = raw_input(log.bold('Notes (c=cancel) ? ')).strip()
- if notes.strip().lower() == 'c':
- print log.red('Canceled')
- return None
- groups = []
- all_groups = self.db.get_all_groups()
- while True:
- add_group = raw_input(log.bold('Member of group (<enter>=done*, c=cancel) ? ')).strip()
- if add_group.lower() == 'c':
- print log.red('Canceled')
- return None
- if add_group not in all_groups:
- log.warn('Group not found.')
- while True:
- user_input = raw_input(log.bold('Is this a new group (y=yes*, n=no) ? ')).lower().strip()
- if user_input not in ('', 'n', 'y'):
- log.error("Please enter 'y', 'n' or press <enter> for 'yes'.")
- continue
-
- break
- if user_input == 'n':
- continue
-
-
- if add_group in groups:
- log.error('Group already specified. Choose a different group name or press <enter> to continue.')
- continue
-
- groups.append(add_group)
- groups.append('All')
- self.db.set(nickname, title, firstname, lastname, faxnum, groups, notes)
- self.do_show(nickname)
-
- do_new = do_add
-
- def do_addgrp(self, args):
- '''
- Add a group.
- addgrp [group]
- newgrp [group]
- '''
- group = self.get_groupname(args, fail_if_match = True)
- if not group:
- return None
- entries = []
- while True:
- nickname = self.get_nickname('', fail_if_match = False, alt_text = True)
- if nickname.lower() == 'c':
- print log.red('Canceled')
- return None
- entries.append(nickname)
- continue
- None if not nickname.lower() else group
- self.db.update_groups(group, entries)
- print
-
- do_newgrp = do_addgrp
-
- def do_view(self, args):
- '''
- View all name data.
- view
- '''
- all_entries = self.db.get_all_records()
- log.debug(all_entries)
- print log.bold('\nView all Data:\n')
- if len(all_entries) > 0:
- f = tui.Formatter()
- f.header = ('Name', 'Fax', 'Notes', 'Member of Group(s)')
- for name, e in all_entries.items():
- if not name.startswith('__'):
- f.add((name, e['fax'], e['notes'], ', '.join(e['groups'])))
- continue
-
- f.output()
-
- print
-
-
- def do_show(self, args):
- '''
- Show a name (all details).
- show [name]
- details [name]
- '''
- name = self.get_nickname(args, fail_if_match = False)
- if not name:
- return None
- e = self.db.get(name)
- if e:
- f = tui.Formatter()
- f.header = ('Key', 'Value')
- f.add(('Name:', name))
- f.add(('Fax Number:', e['fax']))
- f.add(('Notes:', e['notes']))
- f.add(('Member of Group(s):', ', '.join(e['groups'])))
- f.output()
- else:
- log.error("Name not found. Use the 'names' command to view all names.")
- print
-
- do_details = do_show
-
- def do_rm(self, args):
- '''
- Remove a name.
- rm [name]
- del [name]
- '''
- nickname = self.get_nickname(args, fail_if_match = False)
- if not nickname:
- return None
- self.db.delete(nickname)
- print
-
- do_del = do_rm
-
- def do_rmgrp(self, args):
- '''
- Remove a group.
- rmgrp [group]
- delgrp [group]
- '''
- group = self.get_groupname(args, fail_if_match = False)
- if not group:
- return None
- self.db.delete_group(group)
- print
-
- do_delgrp = do_rmgrp
-
- def do_about(self, args):
- '''About fab.'''
- utils.log_title(__title__, __version__)
-
-
- def do_import(self, args):
- '''
- Import LDIF
- import <filename> [type]
- [type] = vcf|ldif|auto
- '''
- args = args.strip().split()
- if not args:
- log.error('You must specify a filename to import from.')
- return None
- filename = args[0]
- if len(args) > 1:
- typ = args[1].lower()
- else:
- typ = 'auto'
- if typ not in ('auto', 'ldif', 'vcf', 'vcard'):
- log.error('Invalid type: %s' % typ)
- return None
- if not os.path.exists(filename):
- log.error('File %s not found.' % filename)
- return None
- if typ == 'ldif':
- print 'Importing from LDIF file %s...' % filename
- (ok, error_str) = self.db.import_ldif(filename)
- elif typ in ('vcard', 'vcf'):
- print 'Importing from VCF file %s...' % filename
- (ok, error_str) = self.db.import_vcard(filename)
-
- if not ok:
- log.error(error_str)
- else:
- self.do_list('')
- print
-
-
- mod = module.Module(__mod__, __title__, __version__, __doc__, None, (GUI_MODE, INTERACTIVE_MODE), (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4))
- mod.setUsage(module.USAGE_FLAG_NONE)
- (opts, device_uri, printer_name, mode, ui_toolkit, loc) = mod.parseStdOpts(handle_device_printer = False)
- if ui_toolkit == 'qt3':
- if not utils.canEnterGUIMode():
- log.error('%s GUI mode requires GUI support (try running with --qt4). Entering interactive mode.' % __mod__)
- mode = INTERACTIVE_MODE
-
- elif not utils.canEnterGUIMode4():
- log.error('%s GUI mode requires GUI support (try running with --qt3). Entering interactive mode.' % __mod__)
- mode = INTERACTIVE_MODE
-
- if mode == GUI_MODE:
- if ui_toolkit == 'qt3':
- log.set_module('hp-fab(qt3)')
-
- try:
- from qt import *
- from ui.faxaddrbookform import FaxAddrBookForm
- except ImportError:
- log.error('Unable to load Qt3 support. Is it installed?')
- sys.exit(1)
-
- app = None
- addrbook = None
- app = QApplication(sys.argv)
- if loc is None:
- loc = user_conf.get('ui', 'loc', 'system')
- if loc.lower() == 'system':
- loc = str(QTextCodec.locale())
- log.debug('Using system locale: %s' % loc)
-
-
- if loc.lower() != 'c':
- e = 'utf8'
-
- try:
- (l, x) = loc.split('.')
- loc = '.'.join([
- l,
- e])
- except ValueError:
- l = loc
- loc = '.'.join([
- loc,
- e])
-
- log.debug('Trying to load .qm file for %s locale.' % loc)
- trans = QTranslator(None)
- qm_file = 'hplip_%s.qm' % l
- log.debug('Name of .qm file: %s' % qm_file)
- loaded = trans.load(qm_file, prop.localization_dir)
- if loaded:
- app.installTranslator(trans)
- else:
- loc = 'c'
-
- if loc == 'c':
- log.debug("Using default 'C' locale")
- else:
- log.debug('Using locale: %s' % loc)
- QLocale.setDefault(QLocale(loc))
- prop.locale = loc
-
- try:
- locale.setlocale(locale.LC_ALL, locale.normalize(loc))
- except locale.Error:
- pass
-
- addrbook = FaxAddrBookForm()
- addrbook.show()
- app.setMainWidget(addrbook)
-
- try:
- log.debug('Starting GUI loop...')
- app.exec_loop()
- except KeyboardInterrupt:
- pass
-
- sys.exit(0)
- else:
-
- try:
- from PyQt4.QtGui import QApplication
- from ui4.fabwindow import FABWindow
- except ImportError:
- log.error('Unable to load Qt4 support. Is it installed?')
- sys.exit(1)
-
- log.set_module('hp-fab(qt4)')
- app = QApplication(sys.argv)
- fab = FABWindow(None)
- fab.show()
-
- try:
- log.debug('Starting GUI loop...')
- app.exec_()
- except KeyboardInterrupt:
- sys.exit(0)
-
- else:
-
- try:
- from fax import fax
- except ImportError:
- log.error('Fax address book disabled - Python 2.3+ required.')
- sys.exit(1)
-
- console = Console()
-
- try:
- console.cmdloop()
- except KeyboardInterrupt:
- log.error('User exit.')
-
- log.info('')
- log.info('Done.')
-